package array.minSubArrayLen;

import java.util.HashSet;
import java.util.Set;

/**
 * @Author: 海琳琦
 * @Date: 2021/12/15 11:08
 *
 * 你正在探访一家农场，农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示，其中 fruits[i] 是第 i 棵树上的水果 种类 。
 *
 * 你想要尽可能多地收集水果。然而，农场的主人设定了一些严格的规矩，你必须按照要求采摘水果：
 *
 * 你只有 两个 篮子，并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。
 * 你可以选择任意一棵树开始采摘，你必须从 每棵 树（包括开始采摘的树）上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次，你将会向右移动到下一棵树，并继续采摘。
 * 一旦你走到某棵树前，但水果不符合篮子的水果类型，那么就必须停止采摘。
 * 给你一个整数数组 fruits ，返回你可以收集的水果的 最大 数目。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/fruit-into-baskets
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Title904 {
    public static void main(String[] args) {
        int[] fruits = {1, 2, 3, 2, 2};
        int result = totalFruit(fruits);
        System.out.println(result);

    }

    private static int totalFruit(int[] fruits) {
        Set<Integer> baskets = new HashSet<>(2);
        int maxLength = 0;
        for (int left = 0, right = 0; right < fruits.length; right++) {
            baskets.add(fruits[right]);
            if (baskets.size() > 2) {
                //确定left位置
                for (int i = right-1; i >=0; i--) {
                    left = i;
                    if (fruits[i] == fruits[i - 1]) {
                        left--;
                    }else{
                        break;
                    }
                }
                baskets.remove(fruits[left-1]);
            }else{
                maxLength = Math.max(right - left + 1, maxLength);
            }
        }
        return maxLength;
    }
}
